package com.xyy.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.xyy.entity.Activity;
import com.xyy.entity.DoctorActivityRegistration;
import com.xyy.entity.DoctorActivityRegistrationVO;

/**
 * 医生活动报名服务接口
 */
public interface DoctorActivityRegistrationService extends IService<DoctorActivityRegistration> {
    
    /**
     * 获取医生可以报名的活动列表（医生附属管理员发布的活动）
     * @param doctorId 医生ID
     * @param current 当前页
     * @param size 每页大小
     * @return 活动列表
     */
    IPage<Activity> getAvailableActivitiesForDoctor(Long doctorId, Long current, Long size);
    
    /**
     * 获取医生已报名的活动列表
     * @param doctorId 医生ID
     * @param current 当前页
     * @param size 每页大小
     * @return 已报名活动列表
     */
    IPage<Activity> getRegisteredActivitiesByDoctor(Long doctorId, Long current, Long size);
    
    /**
     * 获取医生已报名的活动列表（包含报名状态信息）
     * @param doctorId 医生ID
     * @param current 当前页
     * @param size 每页大小
     * @return 已报名活动列表（包含状态）
     */
    IPage<com.xyy.vo.DoctorActivityVO> getRegisteredActivitiesWithStatusByDoctor(Long doctorId, Long current, Long size);
    
    /**
     * 医生报名活动
     * @param activityId 活动ID
     * @param doctorId 医生ID
     * @param remark 备注
     * @return 是否成功
     */
    boolean registerActivity(Long activityId, Long doctorId, String remark);
    
    /**
     * 医生取消报名（删除报名记录）
     * @param activityId 活动ID
     * @param doctorId 医生ID
     * @return 是否成功
     */
    boolean cancelRegistration(Long activityId, Long doctorId);
    
    /**
     * 统计医生参加过的活动数量
     * @param doctorId 医生ID
     * @return 参加过的活动数量
     */
    Integer countAttendedActivitiesByDoctor(Long doctorId);
    
    /**
     * 统计医生总积分
     * @param doctorId 医生ID
     * @return 总积分
     */
    Integer getTotalPointsByDoctor(Long doctorId);
    
    /**
     * 管理员审核医生报名并给予积分
     * @param registrationId 报名记录ID
     * @param status 审核状态（COMPLETED）
     * @param pointsEarned 给予的积分
     * @return 是否成功
     */
    boolean approveRegistrationAndGivePoints(Long registrationId, String status, Integer pointsEarned);
    
    /**
     * 获取活动的所有报名医生列表
     * @param activityId 活动ID
     * @param current 当前页
     * @param size 每页大小
     * @return 报名医生列表
     */
    IPage<DoctorActivityRegistration> getRegistrationsByActivity(Long activityId, Long current, Long size);
    
    /**
     * 获取活动的所有报名医生列表（包含医生详细信息）
     * @param activityId 活动ID
     * @param current 当前页
     * @param size 每页大小
     * @return 报名医生列表
     */
    IPage<DoctorActivityRegistrationVO> getRegistrationsByActivityWithDoctorInfo(Long activityId, Long current, Long size);
    
    /**
     * 统计医生今日活动数量
     * @param doctorId 医生ID
     * @return 今日活动数量
     */
    Integer countTodayActivitiesByDoctor(Long doctorId);
    
    /**
     * 统计医生本月活动数量
     * @param doctorId 医生ID
     * @return 本月活动数量
     */
    Integer countThisMonthActivitiesByDoctor(Long doctorId);
    
    /**
     * 统计医生总活动数量
     * @param doctorId 医生ID
     * @return 总活动数量
     */
    Integer countTotalActivitiesByDoctor(Long doctorId);
    
    /**
     * 统计本医院全部活动数量
     * @param doctorId 医生ID（用于获取医生所属医院）
     * @return 本医院全部活动数量
     */
    Integer countAllActivitiesByHospital(Long doctorId);
}
